<?php

/**
 * Абстрактный социальный сервис
 */
require_once "Core/Social/Abstract.php";

/**
 * Интерфейс социальных сервисов
 */
require_once "Core/Social/Interface.php";

/**
 * Интерфейс возвращаемых даных
 */
require_once "Core/Social/Info/Interface.php";


/**
 * Интерфейс взаимодействия с социальной сетью Vkontakte.ru
 *
 * @author Andriy
 */
class Core_Social_Vkontakte extends Core_Social_Abstract 
                            implements Core_Social_Interface, 
                                       Core_Social_Info_Interface
{
    /**
     * Тип сервиса
     */
    const TYPE = 'vkontakte';

    /**
     * Адрес интерфейса OAuth
     */
    const OAUTH_URL = 'https://api.vkontakte.ru/oauth/';

    /**
     * Адрес интерфейса для вызова аpi vkontakte
     */
    const METHOD_URL = 'https://api.vkontakte.ru/method/';

    /**
     * Массив данных пользователя которые вернутся из метода getUserInfo
     *
     * @var array
     */
    protected $_user_info_keys = array(
        'uid',
        'first_name',
        'last_name',
        'nickname',
        'domain',
        'sex',
        'bdate',
        'city',
        'country',
        'timezone',
        'photo',
        'photo_medium',
        'photo_big',
        'has_mobile',
        'rate',
        'contacts',
        'education',
        'online'
    );
    /**
     * Идентификатор приложения
     *
     * @var int
     */
    protected $_application_id = null;
    /**
     * Секретный ключ
     *
     * @var string
     */
    protected $_sec_key = null;
    /**
     * Код для получения token_id
     *
     * @var string
     */
    protected $_code = 0;
    /**
     * Token id
     *
     * @var string
     */
    protected $_token_id = 0;
    
    /**
     * User info
     *
     * @var array
     */
    protected $_user_info = null;


        /**
     *
     * @param int $application_id - идентификатор приложения
     * @param int $sec_key - секретный ключ
     */
    public function __construct()
    {
        
    }

    public function setApplicationId( $application_id )
    {
        $this->_application_id = $application_id;
    }

    public function setSecretKey( $sec_key )
    {
        $this->_sec_key = $sec_key;
    }

    /**
     * Инициализация сервиса
     */
    public function init()
    {
        if( isset( $_GET['error'] ) && $_GET['error'] == "access_denied" )
        {
            $this->setError( "Ви не дозволили авторизацію через цей сервіс" );
        }

        if( isset( $_GET['code'] ) )
        {
            $this->_code = $_GET['code'];
            $this->_getToken( $this->_code );
        }
    }

    /**
     * Получает token id по коду
     *
     * @param string $code - код для получения token id
     * @return int | boolean
     */
    protected function _getToken( $code )
    {
        $url = self::OAUTH_URL . 'access_token?';
        $url .= 'client_id=' . $this->_application_id . '&';
        $url .= 'client_secret=' . $this->_sec_key . '&';
        $url .= 'code=' . $code;

        $result = $this->_getResponse( $url );
        $result = (array) json_decode( $result );

        if( !isset( $result['access_token'] ) || !isset( $result['user_id'] ) )
        {
            return false;
        }

        $this->_token_id = $result['access_token'];
        $this->_user_id = $result['user_id'];

        return $this->_token_id;
    }

    /**
     * Возвращает информацию о пользователе по его идентификатору
     *
     * @param int $user_id
     * @return array
     */
    public function _getUserInfo( $user_id )
    {
        if( !$this->_user_info )
        {
            $fields = implode( ',', $this->_user_info_keys );
            $url = self::METHOD_URL . 'getProfiles?uids=' . $user_id . '&fields=' . $fields;
            $result = $this->_getResponse( $url );
            $result = (array) json_decode( $result );

            if( !isset( $result['response'] ) || !isset( $result['response'][0] ) )
            {
                return array();
            }

            $this->_user_info = (array) $result['response'][0];
        }
        
        return $this->_user_info;
    }

    /**
     * Возвращает слушатель кнопки для авторизации
     *
     * @return string
     */
    public function getScriptLoginHandler()
    {
        $authorize = self::OAUTH_URL . 'authorize?client_id=' . $this->_application_id .
//                '&scope=friends' .
                '&redirect_uri=' . $this->getAuthUrl() . '?social_type=' . self::TYPE;

        $script = '$(function(){
                       $("a#social-' . self::TYPE . '").click(function(event){
                           event.preventDefault();
                           window.open("' . $authorize . '","vkontakte.ru","width=800,height=420,toolbar=no, location=no,directories=no,status=no, menubar=no, scrollbars=no,copyhistory=no, resizable=no");
                       });
                   });';

        return $script;
    }

    /**
     * Возвращает тип сервиса
     *
     * @return string
     */
    public function getType()
    {
        return self::TYPE;
    }
    
    public function getFirstName()
    {
        $this->_user_info = $this->_getUserInfo( $this->_user_id );
        return $this->_user_info['first_name'];
    }
    
    public function getLastName()
    {
        $this->_user_info = $this->_getUserInfo( $this->_user_id );
        return $this->_user_info['last_name'];
    }
    
    public function getUid()
    {
        $this->_user_info = $this->_getUserInfo( $this->_user_id );
        return $this->_user_info['uid'];
    }
    
    public function getNickname()
    {
        $this->_user_info = $this->_getUserInfo( $this->_user_id );
        
        if( !empty( $this->_user_info['nickname'] ) )
            return $this->_user_info['nickname'];
        
        if( !empty( $this->_user_info['domain'] ) )
            return $this->_user_info['domain'];
        
        $nick = '';
        if( !empty( $this->_user_info['first_name'] ) )
            $nick = $this->_user_info['first_name'];
        
        if( !empty( $this->_user_info['last_name'] ) )
            $nick .= "-" . $this->_user_info['last_name'];
        
        return $nick;
    }
    
    public function getEmail()
    {
        return '';
    }

}

?>
